<?php

namespace app\admin\controller;

use think\Db;
use think\Validate;
use app\admin\controller\Pinyin;

// 学科
class Course extends Auth
{

    // 载入页面
    public function course()
    {
        // 查询学生
        $student = DB::table('v1_student')->where('student_power', '>', 1)->select();
        // 页面赋值
        $this->assign('student', $student);
        // 返回视图页面
        return view("/page/course");
    }

    // 获取学科列表
    public function getList()
    {
        try {
            // 获取请求信息
            $request = $this->request;
            // 是否传入标题
            if ($request->has('courseName', 'get') && $request->get('courseName') != '') {
                // 根据标题条件查询
                $info['where']['v1_course.course_name'] = ['=', $request->get('courseName')];
            }
            // 是否传入学生
            if ($request->has('studentId', 'get') && $request->get('studentId') != '') {
                // 根据状态条件查询
                $info['where']['v1_course.student_id'] = ['=', $request->get('studentId')];
            }
            // 操作表
            $info['table'] = 'v1_course';
            // 别名处理
            $field  = '
            v1_course.*,
            v1_student.student_name';
            // 设置别名
            $info['field'] = $field;
            // 是否不分页获取全部数据
            if (!$request->has('list', 'get') && $request->get('list') != 'all') {
                // 分页
                $info['limit'] = $this->getPageing();
            }
            // 排序
            $info['order'] = "v1_course.course_id desc";
            // 链表
            $info['join'] = [
                ["v1_student", "v1_course.student_id=v1_student.student_id"]
            ];
            // 查询数据
            return $this->queryList($info);
        } catch (\Exception $e) {
            // 返回空数据
            return json($this->initEmptyData());
        }
    }

    // 获取学科信息
    public function getInfo()
    {
    }

    // 添加学科
    public function addInfo()
    {
        try {
            // 验证是否管理员
            if (session(USERPOWER) > 1) {
                return json($this->initTips(300, "权限不足"));
            }
            // 获取请求信息
            $request = $this->request;
            // 信息验证
            $validate = new Validate([
                'courseName' => 'require',
                'studentId' => 'require',
            ], [
                'courseName.require' => '学科名称不能为空',
                'studentId.require' => '课代表不能为空',
            ]);
            // 判断验证是否通过
            if (!$validate->check($request->post())) {
                // 表单验证失败
                return json($this->initTips(100, $validate->getError()));
            } else {
                Db::startTrans(); //开启事务
                try {
                    // 实例化中文转拼音类
                    $pinyin = new Pinyin();
                    // 学科作业存放奴鲁
                    $dirname = str_replace(' ', '', $pinyin->getPinyin($request->post('courseName'))) . date('YmdHis');
                    $dirpath = ASSET . $dirname;
                    // 目录是否存在
                    if (!file_exists($dirpath)) {
                        if (!mkdir($dirpath, 0777, true)) {
                            return json($this->initTips(400, "作业存放目录创建失败，请设置777权限"));
                        }
                    }
                    // 添加数据处理
                    $data = [
                        "course_name" => $request->post('courseName'),
                        "student_id" => $request->post('studentId'),
                        "course_path" => $dirname
                    ];
                    // 添加数据
                    $res = Db::table('v1_course')->insertGetId($data);
                    // 判断数据是否添加成功
                    if ($res >= 0) {
                        //设置课代表
                        if ($this->editUserCourse($request->post('studentId'), '2')) {
                            // 事务提交
                            Db::commit();
                            // 返回信息
                            return json($this->initTips(200, '添加成功'));
                        } else {
                            // 事务回滚
                            Db::rollback();
                            // 返回信息
                            return json($this->initTips(400));
                        }
                    } else {
                        // 事务回滚
                        Db::rollback();
                        if (!file_exists($dirpath)) {
                            rmdir($dirpath);
                        }
                        // 返回信息
                        return json($this->initTips(400));
                    }
                } catch (\Exception $ee) {
                    // 事务回滚
                    Db::rollback();
                    if (!file_exists($dirpath)) {
                        rmdir($dirpath);
                    }
                    // 返回异常信息
                    return json($this->initTips(500));
                }
            }
        } catch (\Exception $e) {
            // 处理异常抛出
            return json($this->initTips());
        }
    }

    // 编辑学科
    public function editInfo()
    {
        try {
            // 验证是否管理员
            if (session(USERPOWER) > 1) {
                return json($this->initTips(300, "权限不足"));
            }
            // 获取请求信息
            $request = $this->request;
            // 信息验证
            $validate = new Validate([
                'id' => 'require',
                'studentId' => 'require',
                'courseName' => 'require',
            ], [
                'id.require' => 'ID不能为空',
                'studentId.require' => '课代表不能为空',
                'courseName.require' => '学科名称不能为空',
            ]);
            // 判断验证是否通过
            if (!$validate->check($request->post())) {
                // 表单验证失败
                return json($this->initTips(100, $validate->getError()));
            } else {
                Db::startTrans(); //开启事务
                try {
                    // 查询修改前学科信息
                    $course = DB::table('v1_course')->where('course_id', $request->post('id'))->find();
                    // 修改数据处理
                    $data = [
                        "course_name" => $request->post('courseName'),
                        "student_id" => $request->post('studentId'),
                    ];
                    // 修改数据
                    $res = Db::table('v1_course')->where('course_id', $request->post('id'))->update($data);
                    // 判断数据是否修改成功
                    if ($res >= 0) {
                        //取消课代表
                        if ($this->testCourseUser($course['student_id'])) {
                            // 设置新课代表
                            if ($this->editUserCourse($request->post('studentId'), '2')) {
                                // 事务提交
                                Db::commit();
                                // 返回信息
                                return json($this->initTips(200, '修改成功'));
                            } else {
                                // 事务回滚
                                Db::rollback();
                                // 返回信息
                                return json($this->initTips(400));
                            }
                        } else {
                            // 事务回滚
                            Db::rollback();
                            // 返回信息
                            return json($this->initTips(400));
                        }
                    } else {
                        // 事务回滚
                        Db::rollback();
                        // 返回信息
                        return json($this->initTips(400));
                    }
                } catch (\Exception $ee) {
                    // 事务回滚
                    Db::rollback();
                    // 返回异常信息
                    return json($this->initTips(500));
                }
            }
        } catch (\Exception $e) {
            // 处理异常抛出
            return json($this->initTips());
        }
    }

    // 删除学科
    public function delInfoAll()
    {
        try {
            // 验证是否管理员
            if (session(USERPOWER) > 1) {
                return json($this->initTips(300, "权限不足"));
            }
            // 获取请求信息
            $request = $this->request;
            // 信息验证
            $validate = new Validate([
                'ids' => 'require'
            ], [
                'ids.require' => '删除ID不能为空'
            ]);
            // 判断验证是否通过
            if (!$validate->check($request->post())) {
                // 表单验证失败
                return json($this->initTips(100, $validate->getError()));
            } else {
                Db::startTrans(); //开启事务s
                try {
                    // 如果不是数组转为数组
                    if (!is_array($request->post('ids'))) {
                        $_data = explode(",", $request->post('ids'));
                    } else {
                        $_data = $request->post('ids');
                    }
                    $user = Db::table('v1_course')->where('course_id', 'in', $_data)->column('student_id');
                    // 删除数据
                    $res = Db::table('v1_course')->where('course_id', 'in', $_data)->delete();
                    // 判断数据是否添加成功
                    if ($res >= 0) {
                        // 获取课代表名单
                        $users = $this->getCourseNameList();
                        // 循环判断是否撤销课代表身份
                        foreach ($_data as $key => $value) {
                            // var_dump($value);
                            // var_dump($this->testCourseUser($value, $users));
                            $this->testCourseUsers($value, $users);
                            // if ($this->testCourseUsers($value, $users)) {
                            // 事务回滚
                            // Db::rollback();
                            // 返回信息
                            // return json($this->initTips(400));
                            // }
                        }
                        // // 事务回滚
                        // Db::rollback();
                        // return '';
                        // 事务提交
                        Db::commit();
                        // 返回信息
                        return json($this->initTips(200, '删除成功'));
                    } else {
                        // 事务回滚
                        Db::rollback();
                        // 返回信息
                        return json($this->initTips(400));
                    }
                } catch (\Exception $ee) {
                    // 事务回滚
                    Db::rollback();
                    // 返回异常信息
                    return json($this->initTips(500));
                }
            }
        } catch (\Exception $e) {
            // 处理异常抛出
            return json($this->initTips());
        }
    }

    /**
     * 获取课代表名单
     */
    public function getCourseNameList()
    {
        $user = DB::table('v1_student')->where('student_power', '2')->select();
        return $user;
    }

    /**
     * 自动设置课代表
     */
    public function testCourseUsers($course_id, $users)
    {

        foreach ($users as $key => $value) {
            // 
            $this->testCourseUser($value['student_id']);
        }
        return false;
    }

    /**
     * 验证学生是否是课代表
     */
    public function testCourseUser($student_id)
    {
        // 查询是所担任课代表
        $user  = DB::table('v1_course')->where('student_id', $student_id)->select();
        // 判断是否担任其他课代表
        if ($user) {
            return true;
        } else {
            // 取消当前课代表
            return  $this->editUserCourse($student_id);
        }
    }

    /**
     * 修改学生课代表身份
     */
    public function editUserCourse($student_id, $student_power = 3)
    {
        // 查询学生信息
        $course = DB::table('v1_student')->where('student_id', $student_id)->find();
        // 是否需要更新
        if ($course['student_power'] != $student_power) {
            $data = [
                'student_power' => $student_power
            ];
            Db::startTrans(); //开启事务
            try {
                $res =  DB::table('v1_student')->where('student_id', $student_id)->update($data);
                if ($res) {
                    // 事务提交
                    Db::commit();
                    return true;
                } else {
                    // 事务回滚
                    Db::rollback();
                    return false;
                }
            } catch (\Exception $e) {
                // 事务回滚
                Db::rollback();
                // 处理异常抛出
                return false;
            }
        }
        return true;
    }
}
